
package com.x52im.rbchat.logic.search.content;

import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rbchat.logic.alarm.AlarmsFragment;
import com.x52im.rbchat.logic.search.AbstractSearchActivity;
import com.x52im.rbchat.logic.search.SearchMsgSummaryActivity;
import com.x52im.rbchat.logic.search.SearchMsgsDetailActivity;
import com.x52im.rbchat.logic.search.model.MsgSummaryContentDTO;
import com.x52im.rbchat.logic.search.viewholder.MsgSummaryViewHolder;
import com.x52im.rbchat.sqlite.ChatHistoryTable;

import java.util.ArrayList;
import java.util.List;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;

/**
 * 聊天记录可搜索内容实现类（数据将聚合显示）。
 * <p>
 * 该类是为了拆解并分散搜索功能的复杂性，同时提高不同搜索内容的可重用性等，主要是基于设计模式考虑。
 * <p>
 * 该类将实现搜索逻辑、搜索结果的recycleView里的显示效果、点击事件处理等。
 *
 * @author JackJiang
 * @since 8.2
 */
public class MsgSummaryContent extends SearchableContent<MsgSummaryContentDTO, MsgSummaryViewHolder> {

    private final static String TAG = MsgSummaryContent.class.getSimpleName();
    public final static String CATLOG = "聊天记录";

    /**
     * 用于RecycleView的adapter中的onCreateViewHolder方法。
     *
     * @param fragment 对应的fragment对象应用
     * @param parent   对应于列表item的view对象应用
     * @param viewType 列表item的viewType
     * @return 返回对应的ViewHoler对象子类
     */
    @Override
    public MsgSummaryViewHolder onCreateViewHolder(Fragment fragment, @NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(fragment.getActivity()).inflate(R.layout.search_result_item_message_summary, parent, false);
        return new MsgSummaryViewHolder(fragment, itemView);
    }

    /**
     * 用于RecycleView的adapter中的onBindViewHolder方法。
     *
     * @param fragment   对应的fragment对象应用
     * @param holder     对应的ViewHoler对象子类
     * @param userInfo   列表item对应的数据对象引用
     * @param showCatlog 是否显示item上方的标题文本（true表示显示，否则不显示）
     */
    @Override
    public void onBind(Fragment fragment, MsgSummaryViewHolder holder, MsgSummaryContentDTO userInfo, boolean showCatlog) {
        holder.onBind(currentKeyword, userInfo, showCatlog);
    }

    /**
     * 点击事件真正的实施方法。子类可重写本方法实现自已的逻辑。
     *
     * @param fragment 所在fragment对象引用
     * @param holder   viewHodler对象引用
     * @param view     列表item的view对象引用
     * @param m        列表item对应的数据对象引用
     */
    @Override
    public void doClickImpl(Fragment fragment, MsgSummaryViewHolder holder, View view, MsgSummaryContentDTO m) {
        if(m != null){
            // 只查到了一条结果（那就直接进入聊天界面）
            if(m.getResultCount() == 1){
                MsgSummaryContent.toChattingPage(fragment.getActivity(), m, m.getFp());
            }
            // 查到的是多条结果（显示的内容诸如："10条相关聊天记录"），此时就进入聊天详情搜索界面中
            else{
//                Intent intent = new Intent(fragment.getActivity(), SearchMsgsDetailActivity.class);
//                intent.putExtra(AbstractSearchActivity.INTENT_KEY_KEYWORD, currentKeyword);
//                intent.putExtra(AbstractSearchActivity.INTENT_KEY_SHOWALLRESULT, true);
//                intent.putExtra(AbstractSearchActivity.INTENT_KEY_AUTOFOCUSSEARCHINPUTVIEW, false);
//                // 注意此参数，它将决定子级页面里搜索的消息范围为该item指定的聊天对象范围内的消息记录
//                intent.putExtra("msgSummarySS", m);
                fragment.startActivity(createSearhMsgDetailIntent(fragment.getActivity(), currentKeyword, m));
            }
        }
    }

    /**
     * 点击"查看更多"事件真正的实施方法。
     *
     * @param fragment 所在fragment对象引用
     * @param view     列表item的view对象引用
     * @see #doClickMore(Fragment, View)
     */
    public void doClickMoreImpl(Fragment fragment, View view) {
        Intent intent = new Intent(fragment.getActivity(), SearchMsgSummaryActivity.class);
        intent.putExtra(AbstractSearchActivity.INTENT_KEY_KEYWORD, currentKeyword);
        intent.putExtra(AbstractSearchActivity.INTENT_KEY_SHOWALLRESULT, true);
        intent.putExtra(AbstractSearchActivity.INTENT_KEY_AUTOFOCUSSEARCHINPUTVIEW, false);
        fragment.startActivity(intent);
    }

    /**
     * 搜索好友的实施方法。
     *
     * @param keyword 要搜索的关键词
     * @return 返回的搜索结果集
     */
    @Override
    public List<MsgSummaryContentDTO> doSearchImpl(String keyword, boolean searchAll) {
        ArrayList<MsgSummaryContentDTO> result = new ArrayList<>();
        ChatHistoryTable chatMessageTable = null;
        try {
            // 初始化表操作对象
            chatMessageTable = ChatHistoryTable.getInstance(MyApplication.getInstance2());
            chatMessageTable.open();

            // 查出包含该关键字的聊天消息（按聊天对象聚合合的结果，仅在只有一条结果时为消息详情）
            result = chatMessageTable.searchMessagesSummery(keyword
                    // searchAll==false时，目前用于搜索首页（大于限定条数会显示"查看更多xxx"item），执行查询时
                    // 只查询限定数+1的目的是既确保只查询有限数据（多了浪费内存啊）又能让UI界面上判断已多天限定数从
                    // 而可以显示"查看更多xxx"item，相当于只多查了一条，既不浪费资源又达到了判断存在更多条数的目的
                    , searchAll? 0 : (RESULT_LIST_ITEM_DEFAULT_SHOW_COUNT +1) );
        } catch (Exception e) {
            Log.w(TAG, e);
        } finally {
            try{
                if(chatMessageTable != null)
                    chatMessageTable.close();
            } catch (Exception e){
            }
        }

        return result;
    }

    /**
     * 返回本搜索内容显示在结果列表界面中时的对应的viewType。
     * 子类重写本方法实现自已的viewType生成逻辑，要求是：本值应大于100（100以内为保留值）、且本值应在显示列表中全局唯一。
     *
     * @return 返回viewType值
     */
    @Override
    public int getViewType() {
        return R.layout.search_result_item_message_summary;
    }

    /**
     * 返回对应搜索内容的标题栏文本内容。
     *
     * @return 返回标题栏文本内容
     */
    @Override
    public String getCategory() {
        return CATLOG;
    }

    /**
     * 创建进入搜索聊天详细页面的Intent.
     *
     * @param c 上下文对象
     * @param currentKeyword 搜索关键字（可为空）
     * @param currentSummaryResult 注意此参数，它将决定子级页面里搜索的消息范围为该item指定的聊天对象范围内的消息记录
     * @return 返回Intent对象
     */
    public static Intent createSearhMsgDetailIntent(Context c, String currentKeyword, MsgSummaryContentDTO currentSummaryResult){
        Intent intent = new Intent(c, SearchMsgsDetailActivity.class);
        intent.putExtra(AbstractSearchActivity.INTENT_KEY_KEYWORD, currentKeyword);
        intent.putExtra(AbstractSearchActivity.INTENT_KEY_SHOWALLRESULT, true);
        intent.putExtra(AbstractSearchActivity.INTENT_KEY_AUTOFOCUSSEARCHINPUTVIEW, false);
        // 注意此参数，它将决定子级页面里搜索的消息范围为该item指定的聊天对象范围内的消息记录
        intent.putExtra("msgSummarySS", currentSummaryResult);
        return intent;
    }

    /**
     * 进入聊天界面。
     *
     * @param c 上下文对象
     * @param m 列表item数据对象
     * @param highlightOnceMsgFingerprint 该指纹码的消息将高亮显示一次（当前用于搜索功能中进到聊天界面时）
     */
    public static void toChattingPage(Context c, MsgSummaryContentDTO m, String highlightOnceMsgFingerprint){
        if(m.getChatType() == MsgSummaryContentDTO.SEARCH_RESULT_CHAT_TYPE_SINGLE){
            String uid = m.getDataId();
            String nickname = null;
            if(!MyApplication.getInstance2().getIMClientManager().getFriendsListProvider().isUserInRoster2(uid)){
                nickname = MsgSummaryViewHolder.tryGetGustNickname(uid);
            }

            AlarmsFragment.gotoSingleChattingActivity(c, uid, nickname, highlightOnceMsgFingerprint);
        } else{
            AlarmsFragment.gotoGroupChattingActivity(c, m.getDataId(), null, highlightOnceMsgFingerprint);
        }
    }
}
